/**
 * 练习题：
 * 定义一个数组，里面存放用户信息
普通管理员（id、name、role、dept, age）
超级管理员（id、name、role、menus:[{id :1,path:"/home"}],age）
定义一个函数：传递数组进去
1. 返回所有超级管理员
2. 返回年龄最小的用户
 */
interface IMember {
    id: number;
    name: string;
    role: string;
    dept: string;
    age: number;
    menus?: IMenus[];
}
interface IMenus {
    id: number,
    path: string
}

let members: IMember[] = [
    { id: 1, name: "小王", role: "普通管理员", dept: "开发一部", age: 20 },
    {
        id: 2, name: "小张", role: "超级管理员", dept: "开发一部", age: 21,
        menus: [{ id: 1, path: "/home" }]
    },
    { id: 3, name: "小刘", role: "普通管理员", dept: "开发一部", age: 22 },
]

function findObject(params: IMember[]) {
    const res = params.filter(item => item.role === "超级管理员")
    return res
}
function findMinAge(params: IMember[]) {
    //先找年龄最小值
    const minAge = Math.min.apply(null, params.map(item => item.age))
    const res = params.filter(item => item.age == minAge)
    return res
}

/**
 * 练习题：
 * 设计一个函数，这个函数接受一个对象，接受一个key，返回这个key对应值
 * 类型断言
 * 泛型的工具
 */
// interface IUser {
//     id:number,
//     name:string,
//     address:string
// }
// function getValue(params:IUser,key:string){
//     return params[key]
// }

// 定义一个函数，接受一个对象。对象有两种
interface IUser1 {
    id: number,
    role: string,
    play: (num1: number) => void
}
interface IUser2 {
    id: number,
    name: string,
    show: () => void
}

type newUser = IUser1 | IUser2
function log(user: newUser) {
    console.log(user.id)
    //断言：告诉编辑器，user一定是IUser2
    const res = (user as IUser2).name
    // const res2 = <IUser2>user.name
    // const res2 = (<IUser2>user).name
    if((user as IUser2).name){
        //操作对象
        // (user as IUser1).play()
        // user.show()
    }else{

    }
}
log({id:1,name:"xiaowang",show:function(){}})
log({id:2,role:"xiaowang",play:function(num1:number){}})

type fun = ()=>void
function fn(callback:fun | undefined){
    //非空断言：检测callback是undefined的时候。后面()不会被调用
    // ?. 检测对象是否为undefined和null
    // ！判断函数调用情况
    callback!()
}
fn(function(){
    console.log(123);
})

//泛型
/**
 * 定义一个函数：要求接受两个参数。参数一：日期格式。参数二：字符串
 * function format(date:Date,mat:string){}
 * 
 * format(new Date(),"yyyy-MM-dd") ---> 2023-08-22
 * format(new Date(),"yyyy/MM/dd") ---> 2023/08/22
 * format(new Date(),"yyyy/MM/dd hh:mm:ss") ---> 2023/08/22 12:23:10
 * 
 * http://web.woniulab.com?id=1&name=xiaowang
 * -->{id:1,name:xiaowang}
 */








